package pro.cherish.knowledgeutil.str;

import cn.hutool.core.util.StrUtil;

import java.text.MessageFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 创建人：cherish
 * @version 版本号：V1.0
 * <p>
 * ***************************修订记录************************************
 * 2019-11-01 cherish 创建该类功能。
 * **********************************************************************
 * </p>
 * @ClassName 类名：StringUtilExt
 * @Description 功能说明：
 * <p>
 * TODO
 * </p>
 * **********************************************************************
 * @date 创建日期： 2019-11-01 cherish
 */
public class StringUtilExt extends StrUtil {
    /**
     * 对象转为字符串
     *
     * @param obj 原对象
     * @param def 默认值
     * @return
     */
    public static String toString(Object obj, String def) {
        return obj == null ? def : obj.toString();
    }

    /**
     * 对象转为字符串，缺省默认值为""
     *
     * @param obj 原对象
     * @return
     */
    public static String toString(Object obj) {
        return toString(obj, "");
    }


    /**
     * 给字符串补足到指定的长度，从左边补足chr指定的字符
     *
     * @param source 源字符串
     * @param chr    左边补足的字符
     * @param len    最终长度
     * @return
     */
    public static String lPad(String source, String chr, int len) {
        int lenleft = len - source.length();
        if (lenleft < 0) {
            lenleft = 0;
        }
        return (strAdd(chr, lenleft) + source);
    }

    /**
     * 给字符串补足到指定的长度，从右边补足chr指定的字符
     *
     * @param source 源字符串
     * @param chr    右边补足的字符
     * @param len    最终长度
     * @return
     */
    public static String rPad(String source, String chr, int len) {
        int lenleft = len - source.length();
        if (lenleft < 0) {
            lenleft = 0;
        }
        return (source + strAdd(chr, lenleft));
    }

    /**
     * 指定的字符串累加
     *
     * @param chr 字符串
     * @param len 累加个数
     * @return
     */
    public static String strAdd(String chr, int len) {
        if (len > 0) {
            StringBuffer ret = new StringBuffer(len);
            for (int i = 0; i < len; i++) {
                ret.append(chr);
            }
            return (ret.toString());
        } else {
            return "";
        }
    }

    /**
     * 字符串连接，未填分割父，使用空字符串
     *
     * @param conjunction 连接字符序列
     * @param objs        连接对象为可变参数
     * @return
     */
    public static String joinWithNull(CharSequence conjunction, Object... objs) {
        return join(StringUtilExt.toString(conjunction, ""), objs);
    }

    // 包含空格、回车、换行符
    public static Pattern BLANK_STR_PATTERN = Pattern.compile("\\s*|\t|\r|\n");

    /**
     * 清空字符串中的空格、回车、换行符
     *
     * @param str 源字符串
     * @return
     */
    public static String replaceBlank(String str) {
        String dest = "";
        if (str != null) {
            Matcher m = BLANK_STR_PATTERN.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }

    /**
     * 字符串模板填充,采用形如{0}{1}占位符
     * 注意：如果字符串模板带上特殊字符，可能会出现填充失效
     *
     * @param pattern 字符串模板
     * @param args    可变参数
     * @return
     */
    public static String formatString(String pattern, Object... args) {
        return MessageFormat.format(pattern, args);
    }

    /**
     * 字符串大写
     *
     * @param configTypeCode 源字符串
     * @return
     */
    public static String upperCase(String configTypeCode) {
        return configTypeCode.toUpperCase();
    }

    /**
     * 字符串小写
     *
     * @param configTypeCode
     * @return
     */
    public static String lowerCase(String configTypeCode) {
        return configTypeCode.toLowerCase();
    }

    /**
     * 替换第一个出现的字符串字符串
     *
     * @param text         源字符串
     * @param searchString 查询串
     * @param replacement  替换内容
     * @return
     */
    public static String replaceOnce(String text, String searchString, String replacement) {
        return replace(text, searchString, replacement, 1);
    }

    /**
     * 指定替换个数的字符串替换
     *
     * @param text         源字符串
     * @param searchString 查询串
     * @param replacement  替换串
     * @param max          替换个数
     * @return
     */
    public static String replace(String text, String searchString, String replacement, int max) {
        if (!isEmpty(text) && !isEmpty(searchString) && replacement != null && max != 0) {
            int start = 0;
            int end = text.indexOf(searchString, start);
            if (end == -1) {
                return text;
            } else {
                int replLength = searchString.length();
                int increase = replacement.length() - replLength;
                increase = increase < 0 ? 0 : increase;
                increase *= max < 0 ? 16 : (max > 64 ? 64 : max);

                StringBuilder buf;
                for (buf = new StringBuilder(text.length() + increase); end != -1; end = text.indexOf(searchString, start)) {
                    buf.append(text.substring(start, end)).append(replacement);
                    start = end + replLength;
                    --max;
                    if (max == 0) {
                        break;
                    }
                }

                buf.append(text.substring(start));
                return buf.toString();
            }
        } else {
            return text;
        }
    }
}
